package org.convallaria.system.biz.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.convallaria.infrastruct.db.entity.BaseEntity;

import java.io.Serial;

/**
 * 系统部门实体类
 * 
 * 功能特性：
 * - 支持部门层级管理（树形结构）
 * - 支持多租户数据隔离
 * - 支持软删除机制
 * - 支持乐观锁并发控制
 * - 支持数据审计追踪
 * - 支持部门状态管理
 * 
 * 业务说明：
 * - 部门管理是组织架构的核心组件
 * - 支持无限层级的部门树结构
 * - 通过parent_id和ancestors字段维护层级关系
 * - 支持部门负责人和联系方式管理
 * - 支持部门排序和状态控制
 * 
 * 层级关系：
 * - parent_id：父部门ID，0表示根部门
 * - ancestors：祖级列表，用逗号分隔，如"0,1,2"
 * - 通过ancestors字段可以快速查询所有子部门
 * 
 * 关联关系：
 * - 与用户表：一对多关系，通过dept_id关联
 * - 与角色表：多对多关系，通过sys_role_dept关联表
 * - 与租户表：多对一关系，通过tenant_id关联
 * 
 * @author convallaria
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_dept")
public class SysDept extends BaseEntity {

    @Serial
    private static final long serialVersionUID = 1L;

    /**
     * 部门ID
     * 主键，自增长
     */
    @TableId("dept_id")
    private Long deptId;

    /**
     * 父部门ID
     * 0表示根部门，其他值表示父部门ID
     */
    @TableField("parent_id")
    private Long parentId;

    /**
     * 祖级列表
     * 用逗号分隔的祖级部门ID列表，如"0,1,2"
     * 用于快速查询所有子部门
     */
    @TableField("ancestors")
    private String ancestors;

    /**
     * 部门名称
     * 部门显示名称，必填字段
     */
    @TableField("dept_name")
    private String deptName;

    /**
     * 部门编码
     * 部门唯一编码，用于业务标识
     */
    @TableField("dept_code")
    private String deptCode;

    /**
     * 显示顺序
     * 部门在树形结构中的显示顺序，数值越小越靠前
     */
    @TableField("order_num")
    private Integer orderNum;

    /**
     * 负责人
     * 部门负责人姓名
     */
    @TableField("leader")
    private String leader;

    /**
     * 联系电话
     * 部门联系电话，支持手机号和座机号
     */
    @TableField("phone")
    private String phone;

    /**
     * 邮箱
     * 部门联系邮箱
     */
    @TableField("email")
    private String email;

    /**
     * 部门状态
     * 0=正常，1=停用
     * 停用的部门及其子部门都不能被选择
     */
    @TableField("status")
    private String status;

    /**
     * 租户ID
     * 多租户数据隔离标识
     */
    @TableField("tenant_id")
    private Long tenantId;
}
